package com.view;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import org.apache.commons.io.IOUtils;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;

import com.model.Evento;
import com.model.EventoFoto;
import com.model.Tipo;
import com.model.Usuario;
import com.rn.EventoFotoRN;
import com.rn.EventoRN;
import com.rn.TipoRN;
import com.util.ContextoUtil;
import com.util.Mensagens;

@ManagedBean(name="eventoBean")
@ViewScoped
public class EventoBean  {
	
	
	private Tipo tipoSelecionado;
	private Evento eventoSelecionado = new Evento();
	
	
	private List<Evento> lista = null;
	private List<Evento> listaEventos;
	private List<SelectItem> tipoSelect;
	private List<Tipo> listaTipos;
	private List<EventoFoto> eventoFotos;
	
	private ContextoBean contextoBean;
	private Usuario usuarioSelecionado;
	private EventoFoto fotoSelecionada = new EventoFoto();
	private UploadedFile file;
	private byte[] byteData;
	//private byte[] fotoAtual;
	private StreamedContent imagem;
	private Mensagens msgBox = new Mensagens();
	
	
	private final String COL_ID = "photoId";
    private final String COL_IMAGEM = "photoData";


	
	
	public void salvar(){
		
		/*Autor: Artur Veiga
			Status = 1, evento vai acontecer
		*/
		EventoRN eventoRN = new EventoRN();
		EventoFotoRN eventoFotoRN = new EventoFotoRN();
		
		contextoBean = ContextoUtil.getContextoBean();
		usuarioSelecionado =  contextoBean.getUsuarioLogado();
		
		
		try {
		
		fotoSelecionada.setPhotoName(file.getFileName());
		fotoSelecionada.setPhotoData(byteData);
		eventoSelecionado.setStatus(1);
		eventoSelecionado.setPhotoId(fotoSelecionada);
		eventoSelecionado.setUsuario(usuarioSelecionado);
		eventoRN.registraEvento(eventoSelecionado);
		eventoFotoRN.registraEventoFoto(fotoSelecionada);
		
		msgBox.msgDadosInseridos(); 
		
		} catch (Exception e) {
			e.printStackTrace();
			msgBox.msgPreencheCampos();
		}
		
	}
	

	public Evento getEventoSelecionado() {
		return eventoSelecionado;
	}

	public void setEventoSelecionado(Evento eventoSelecionado) {
		this.eventoSelecionado = eventoSelecionado;
	}
	
	
	public Tipo getTipoSelecionado() {
		return tipoSelecionado;
	}


	public void setTipoSelecionado(Tipo tipoSelecionado) {
		this.tipoSelecionado = tipoSelecionado;
	}



	public List<Evento> getLista() {
		EventoRN eventoRN = new EventoRN();
		
		if(lista == null){
			lista = eventoRN.listar();
		}
			
		return lista;
	}

		
	
	public List<SelectItem> getTipoSelect() {
		if(this.tipoSelect == null){
			tipoSelect = new ArrayList<SelectItem>();
			
			TipoRN tipoRN = new TipoRN();
			listaTipos = tipoRN.listar();
			if(listaTipos != null && !listaTipos.isEmpty()){
				SelectItem item;
					for (Tipo tiposLista : listaTipos) {
					item = new SelectItem(tiposLista, tiposLista.getNome());
					tipoSelect.add(item);
				}
			}
		}
		return tipoSelect;
	}


	public EventoFoto getFotoSelecionada() {
		return fotoSelecionada;
	}


	public void setFotoSelecionada(EventoFoto fotoSelecionada) {
		this.fotoSelecionada = fotoSelecionada;
	}
	

  public List<Evento> getListaEventos() {
		return listaEventos;
	}



	// ****************** METODOS DO FILEUPLOAD *********************
	public void handleFileUpload(FileUploadEvent event) {
		file = event.getFile();
		try {
			byteData = IOUtils.toByteArray(file.getInputstream());
			msgBox.msgUploadImage(file);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	

	public StreamedContent getImagem() throws IOException {
		EventoFotoRN fotoRN = new EventoFotoRN();
		EventoFoto fotoR = fotoRN.localizaEventoFoto();
		
		
		InputStream is = new ByteArrayInputStream(fotoR.getPhotoData());  
	    imagem = new DefaultStreamedContent(is, "image/png", "fileName.png");
		return imagem;
		
//		BufferedImage bufferedImg = new BufferedImage(100, 25, BufferedImage.TYPE_INT_RGB);
//        Graphics2D g2 = bufferedImg.createGraphics();
//        g2.drawString("This is a text", 0, 10);
//        ByteArrayOutputStream os = new ByteArrayOutputStream();
//        ImageIO.write(bufferedImg, "png", os);
//        return new DefaultStreamedContent(new ByteArrayInputStream(os.toByteArray()));
	}
	
	
	

	public void setContent(StreamedContent imagem) {
		this.imagem = imagem;
	}


	public List<EventoFoto> getEventoFotos() {
		return eventoFotos;
	}
	
	
	
}
